﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using PaddleOCRSharp;

namespace Zero.UControl.Base.Helper
{
    public class OCRHelper : IDisposable
    {
        private static readonly OCRModelConfig _ocrModelConfig;
        private static readonly PaddleOCREngine _ocrEngine;
        private static readonly PaddleStructureEngine _structengine;

        static OCRHelper()
        {
            // 配置 OCR 模型的路径（检测模型、分类模型、识别模型和字典文件）
            //_ocrModelConfig = new OCRModelConfig()
            //{
            //    det_infer = Path.Combine("OCRModel", "det"),         // 文本检测模型路径
            //    cls_infer = Path.Combine("OCRModel", "cls"),         // 方向分类模型路径
            //    rec_infer = Path.Combine("OCRModel", "rec"), // 文本识别模型路径
            //    keys = Path.Combine("OCRModel", "ppocr_keys.txt")   // 字典文件路径（识别文字时使用）
            //};
            _ocrModelConfig = null; // 直接使用默认配置
            //OCR参数
            OCRParameter oCRParameter = new OCRParameter();
            oCRParameter.cpu_math_library_num_threads = 10;//预测并发线程数
            oCRParameter.enable_mkldnn = true;//web部署该值建议设置为0,否则出错，内存如果使用很大，建议该值也设置为0.
            oCRParameter.cls = false; //是否执行文字方向分类；默认false
            oCRParameter.det = true;//是否开启方向检测，用于检测识别180旋转
            oCRParameter.use_angle_cls = false;//是否开启方向检测，用于检测识别180旋转
            oCRParameter.det_db_score_mode = true;//是否使用多段线，即文字区域是用多段线还是用矩形，
            oCRParameter.max_side_len = 1500;
            oCRParameter.rec_img_h = 48;
            oCRParameter.rec_img_w = 320;
            oCRParameter.det_db_thresh = 0.3f;
            oCRParameter.det_db_box_thresh = 0.618f;

            _ocrEngine = new PaddleOCREngine(_ocrModelConfig,oCRParameter);

            //模型配置，使用默认值
            StructureModelConfig structureModelConfig = null;
            //表格识别参数配置，使用默认值
            StructureParameter structureParameter = new StructureParameter();
            _structengine = new PaddleStructureEngine(structureModelConfig, structureParameter);
        }

        /// <summary>
        /// 识别图像中的文字
        /// </summary>
        public static OCRResult Recognize(BitmapSource image)
        {
            return Recognize(ImageHelper.BitmapSourceToBitmap(image));
        }

        /// <summary>
        /// 识别图像中的文字
        /// </summary>
        public static OCRResult Recognize(Bitmap image)
        {
            if (image == null)
                throw new ArgumentNullException(nameof(image));

            var result = _ocrEngine.DetectText(image);
            return result;
        }

        /// <summary>
        /// 从图像文件识别文字
        /// </summary>
        public static OCRResult Recognize(string imagePath)
        {
            if (!File.Exists(imagePath))
                throw new FileNotFoundException("Image not found.", imagePath);

            using var bmp = new Bitmap(imagePath);
            return Recognize(bmp);
        }

        public void Dispose()
        {
            _ocrEngine?.Dispose();
        }
    }
}
